home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2000 February / Macworld (2000-02).dmg / Updaters / WhiteCap 3.2.2.sea / WhiteCap 3.2.2 / WhiteCap Source / DirectX3 SDK / inc / dinput.h < prev    next >
Text File  |  1996-08-28  |  31KB  |  874 lines

  1. /****************************************************************************
  2.  *
  3.  *  Copyright (C) 1996 Microsoft Corporation.  All Rights Reserved.
  4.  *
  5.  *  File:       dinput.h
  6.  *  Content:    DirectInput include file
  7.  *
  8.  ****************************************************************************/
  9.  
  10. #ifndef __DINPUT_INCLUDED__
  11. #define __DINPUT_INCLUDED__
  12.  
  13. #ifdef _WIN32
  14. #define COM_NO_WINDOWS_H
  15. #include <objbase.h>
  16. #endif
  17.  
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21.  
  22. #define DIRECTINPUT_VERSION         0x0300
  23.  
  24. /****************************************************************************
  25.  *
  26.  *      Class IDs
  27.  *
  28.  ****************************************************************************/
  29.  
  30. DEFINE_GUID(CLSID_DirectInput,      0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  31. DEFINE_GUID(CLSID_DirectInputDevice,0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  32.  
  33. /****************************************************************************
  34.  *
  35.  *      Interfaces
  36.  *
  37.  ****************************************************************************/
  38.  
  39. DEFINE_GUID(IID_IDirectInputA,     0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  40. DEFINE_GUID(IID_IDirectInputW,     0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  41.  
  42. DEFINE_GUID(IID_IDirectInputDeviceA,0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  43. DEFINE_GUID(IID_IDirectInputDeviceW,0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  44.  
  45. /****************************************************************************
  46.  *
  47.  *      Predefined object types
  48.  *
  49.  ****************************************************************************/
  50.  
  51. DEFINE_GUID(GUID_XAxis,   0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  52. DEFINE_GUID(GUID_YAxis,   0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  53. DEFINE_GUID(GUID_ZAxis,   0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  54. DEFINE_GUID(GUID_RAxis,   0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  55. DEFINE_GUID(GUID_UAxis,   0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  56. DEFINE_GUID(GUID_VAxis,   0xA36D02E5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  57.  
  58. DEFINE_GUID(GUID_Button,  0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  59. DEFINE_GUID(GUID_Key,     0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  60.  
  61. DEFINE_GUID(GUID_POV,     0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  62.  
  63. /****************************************************************************
  64.  *
  65.  *      Predefined product GUIDs
  66.  *
  67.  ****************************************************************************/
  68.  
  69. DEFINE_GUID(GUID_SysMouse,   0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  70. DEFINE_GUID(GUID_SysKeyboard,0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  71.  
  72. /****************************************************************************
  73.  *
  74.  *      Interfaces and Structures...
  75.  *
  76.  ****************************************************************************/
  77.  
  78. /****************************************************************************
  79.  *
  80.  *      IDirectInputDevice
  81.  *
  82.  ****************************************************************************/
  83.  
  84. #define DIDEVTYPE_DEVICE    1
  85. #define DIDEVTYPE_MOUSE     2
  86. #define DIDEVTYPE_KEYBOARD  3
  87. #define DIDEVTYPE_JOYSTICK  4
  88.  
  89. #define DIDEVTYPEMOUSE_UNKNOWN          1
  90. #define DIDEVTYPEMOUSE_TRADITIONAL      2
  91. #define DIDEVTYPEMOUSE_FINGERSTICK      3
  92. #define DIDEVTYPEMOUSE_TOUCHPAD         4
  93. #define DIDEVTYPEMOUSE_TRACKBALL        5
  94.  
  95. #define DIDEVTYPEKEYBOARD_PCXT          1
  96. #define DIDEVTYPEKEYBOARD_OLIVETTI      2
  97. #define DIDEVTYPEKEYBOARD_PCAT          3
  98. #define DIDEVTYPEKEYBOARD_PCENH         4
  99. #define DIDEVTYPEKEYBOARD_NOKIA1050     5
  100. #define DIDEVTYPEKEYBOARD_NOKIA9140     6
  101. #define DIDEVTYPEKEYBOARD_NEC98         7
  102. #define DIDEVTYPEKEYBOARD_NEC98LAPTOP   8
  103. #define DIDEVTYPEKEYBOARD_NEC98106      9
  104. #define DIDEVTYPEKEYBOARD_JAPAN106     10
  105. #define DIDEVTYPEKEYBOARD_JAPANAX      11
  106. #define DIDEVTYPEKEYBOARD_J3100        12
  107.  
  108. #define GET_DIDEVICE_TYPE(dwDevType)    LOBYTE(dwDevType)
  109. #define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType)
  110.  
  111. typedef struct _DIDEVCAPS {
  112.     DWORD   dwSize;
  113.     DWORD   dwFlags;
  114.     DWORD   dwDevType;
  115.     DWORD   dwAxes;
  116.     DWORD   dwButtons;
  117.     DWORD   dwPOVs;
  118. } DIDEVCAPS, *LPDIDEVCAPS;
  119.  
  120. #define DIDC_ATTACHED           0x00000001
  121. #define DIDC_POLLEDDEVICE       0x00000002
  122.  
  123. #define DIDFT_ALL           0x00000000
  124.  
  125. #define DIDFT_RELAXIS       0x00000001
  126. #define DIDFT_ABSAXIS       0x00000002
  127. #define DIDFT_AXIS          0x00000003
  128.  
  129. #define DIDFT_PSHBUTTON     0x00000004
  130. #define DIDFT_TGLBUTTON     0x00000008
  131. #define DIDFT_BUTTON        0x0000000C
  132.  
  133. #define DIDFT_POV           0x00000010
  134.  
  135. #define DIDFT_ANYINSTANCE   0x0000FF00
  136. #define DIDFT_MAKEINSTANCE(n) ((BYTE)(n) << 8)
  137. #define DIDFT_GETTYPE(n)     LOBYTE(n)
  138. #define DIDFT_GETINSTANCE(n) HIBYTE(n)
  139.  
  140. typedef struct _DIOBJECTDATAFORMAT {
  141.     const GUID *pguid;
  142.     DWORD   dwOfs;
  143.     DWORD   dwType;
  144.     DWORD   dwFlags;
  145. } DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT;
  146. typedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT;
  147.  
  148. typedef struct _DIDATAFORMAT {
  149.     DWORD   dwSize;
  150.     DWORD   dwObjSize;
  151.     DWORD   dwFlags;
  152.     DWORD   dwDataSize;
  153.     DWORD   dwNumObjs;
  154.     LPDIOBJECTDATAFORMAT rgodf;
  155. } DIDATAFORMAT, *LPDIDATAFORMAT;
  156. typedef const DIDATAFORMAT *LPCDIDATAFORMAT;
  157.  
  158. #define DIDF_ABSAXIS            0x00000001
  159. #define DIDF_RELAXIS            0x00000002
  160.  
  161. extern const DIDATAFORMAT c_dfDIMouse;
  162. extern const DIDATAFORMAT c_dfDIKeyboard;
  163.  
  164. typedef struct DIDEVICEOBJECTINSTANCEA {
  165.     DWORD   dwSize;
  166.     GUID    guidType;
  167.     DWORD   dwOfs;
  168.     DWORD   dwType;
  169.     DWORD   dwFlags;
  170.     CHAR    tszName[MAX_PATH];
  171. } DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA;
  172. typedef struct DIDEVICEOBJECTINSTANCEW {
  173.     DWORD   dwSize;
  174.     GUID    guidType;
  175.     DWORD   dwOfs;
  176.     DWORD   dwType;
  177.     DWORD   dwFlags;
  178.     WCHAR   tszName[MAX_PATH];
  179. } DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW;
  180. #ifdef UNICODE
  181. typedef DIDEVICEOBJECTINSTANCEW DIDEVICEOBJECTINSTANCE;
  182. typedef LPDIDEVICEOBJECTINSTANCEW LPDIDEVICEOBJECTINSTANCE;
  183. #else
  184. typedef DIDEVICEOBJECTINSTANCEA DIDEVICEOBJECTINSTANCE;
  185. typedef LPDIDEVICEOBJECTINSTANCEA LPDIDEVICEOBJECTINSTANCE;
  186. #endif // UNICODE
  187. typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA;
  188. typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW;
  189. typedef const DIDEVICEOBJECTINSTANCE  *LPCDIDEVICEOBJECTINSTANCE;
  190.  
  191. typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA, LPVOID);
  192. typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW, LPVOID);
  193. #ifdef UNICODE
  194. #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKW
  195. #else
  196. #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKA
  197. #endif // !UNICODE
  198.  
  199. typedef struct DIPROPHEADER {
  200.     DWORD   dwSize;
  201.     DWORD   dwHeaderSize;
  202.     DWORD   dwObj;
  203.     DWORD   dwHow;
  204. } DIPROPHEADER, *LPDIPROPHEADER;
  205. typedef const DIPROPHEADER *LPCDIPROPHEADER;
  206.  
  207. #define DIPH_DEVICE             0
  208. #define DIPH_BYOFFSET           1
  209. #define DIPH_BYID               2
  210.  
  211. typedef struct DIPROPDWORD {
  212.     DIPROPHEADER diph;
  213.     DWORD   dwData;
  214. } DIPROPDWORD, *LPDIPROPDWORD;
  215. typedef const DIPROPDWORD *LPCDIPROPDWORD;
  216.  
  217. typedef struct DIPROPRANGE {
  218.     DIPROPHEADER diph;
  219.     LONG    lMin;
  220.     LONG    lMax;
  221. } DIPROPRANGE, *LPDIPROPRANGE;
  222. typedef const DIPROPRANGE *LPCDIPROPRANGE;
  223.  
  224. #define DIPROPRANGE_NOMIN       ((LONG)0x80000000)
  225. #define DIPROPRANGE_NOMAX       ((LONG)0x7FFFFFFF)
  226.  
  227. #ifdef __cplusplus
  228. #define MAKEDIPROP(prop)    (*(const GUID *)(prop))
  229. #else
  230. #define MAKEDIPROP(prop)    ((REFGUID)(prop))
  231. #endif
  232.  
  233. #define DIPROP_BUFFERSIZE       MAKEDIPROP(1)
  234.  
  235. #define DIPROP_AXISMODE         MAKEDIPROP(2)
  236.  
  237. #define DIPROPAXISMODE_ABS      0
  238. #define DIPROPAXISMODE_REL      1
  239.  
  240. #define DIPROP_GRANULARITY      MAKEDIPROP(3)
  241.  
  242. #define DIPROP_RANGE            MAKEDIPROP(4)
  243.  
  244. typedef struct DIDEVICEOBJECTDATA {
  245.     DWORD   dwOfs;
  246.     DWORD   dwData;
  247.     DWORD   dwTimeStamp;
  248.     DWORD   dwSequence;
  249. } DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;
  250.  
  251. #define DIGDD_PEEK          0x00000001
  252.  
  253. #define DISEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \
  254.                         ((int)((dwSequence1) - (dwSequence2)) cmp 0)
  255.  
  256. #define DISCL_EXCLUSIVE     0x00000001
  257. #define DISCL_NONEXCLUSIVE  0x00000002
  258. #define DISCL_FOREGROUND    0x00000004
  259. #define DISCL_BACKGROUND    0x00000008
  260.  
  261. typedef struct DIDEVICEINSTANCEA {
  262.     DWORD   dwSize;
  263.     GUID    guidInstance;
  264.     GUID    guidProduct;
  265.     DWORD   dwDevType;
  266.     CHAR    tszInstanceName[MAX_PATH];
  267.     CHAR    tszProductName[MAX_PATH];
  268. } DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA;
  269. typedef struct DIDEVICEINSTANCEW {
  270.     DWORD   dwSize;
  271.     GUID    guidInstance;
  272.     GUID    guidProduct;
  273.     DWORD   dwDevType;
  274.     WCHAR   tszInstanceName[MAX_PATH];
  275.     WCHAR   tszProductName[MAX_PATH];
  276. } DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW;
  277. #ifdef UNICODE
  278. typedef DIDEVICEINSTANCEW DIDEVICEINSTANCE;
  279. typedef LPDIDEVICEINSTANCEW LPDIDEVICEINSTANCE;
  280. #else
  281. typedef DIDEVICEINSTANCEA DIDEVICEINSTANCE;
  282. typedef LPDIDEVICEINSTANCEA LPDIDEVICEINSTANCE;
  283. #endif // UNICODE
  284. typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA;
  285. typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW;
  286. typedef const DIDEVICEINSTANCE  *LPCDIDEVICEINSTANCE;
  287.  
  288. #undef INTERFACE
  289. #define INTERFACE IDirectInputDeviceW
  290.  
  291. DECLARE_INTERFACE_(IDirectInputDeviceW, IUnknown)
  292. {
  293.     /*** IUnknown methods ***/
  294.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  295.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  296.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  297.  
  298.     /*** IDirectInputDeviceW methods ***/
  299.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  300.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE;
  301.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  302.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  303.     STDMETHOD(Acquire)(THIS) PURE;
  304.     STDMETHOD(Unacquire)(THIS) PURE;
  305.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  306.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  307.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  308.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  309.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  310.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE;
  311.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE;
  312.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  313.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  314. };
  315.  
  316. typedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW;
  317.  
  318. #undef INTERFACE
  319. #define INTERFACE IDirectInputDeviceA
  320.  
  321. DECLARE_INTERFACE_(IDirectInputDeviceA, IUnknown)
  322. {
  323.     /*** IUnknown methods ***/
  324.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  325.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  326.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  327.  
  328.     /*** IDirectInputDeviceA methods ***/
  329.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  330.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE;
  331.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  332.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  333.     STDMETHOD(Acquire)(THIS) PURE;
  334.     STDMETHOD(Unacquire)(THIS) PURE;
  335.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  336.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  337.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  338.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  339.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  340.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE;
  341.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE;
  342.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  343.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  344. };
  345.  
  346. typedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA;
  347.  
  348. #ifdef UNICODE
  349. #define IID_IDirectInputDevice IID_IDirectInputDeviceW
  350. #define IDirectInputDevice IDirectInputDeviceW
  351. #define IDirectInputDeviceVtbl IDirectInputDeviceWVtbl
  352. #else
  353. #define IID_IDirectInputDevice IID_IDirectInputDeviceA
  354. #define IDirectInputDevice IDirectInputDeviceA
  355. #define IDirectInputDeviceVtbl IDirectInputDeviceAVtbl
  356. #endif
  357. typedef struct IDirectInputDevice *LPDIRECTINPUTDEVICE;
  358.  
  359. #if !defined(__cplusplus) || defined(CINTERFACE)
  360. #define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  361. #define IDirectInputDevice_AddRef(p) (p)->lpVtbl->AddRef(p)
  362. #define IDirectInputDevice_Release(p) (p)->lpVtbl->Release(p)
  363. #define IDirectInputDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a)
  364. #define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
  365. #define IDirectInputDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b)
  366. #define IDirectInputDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b)
  367. #define IDirectInputDevice_Acquire(p) (p)->lpVtbl->Acquire(p)
  368. #define IDirectInputDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p)
  369. #define IDirectInputDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b)
  370. #define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d)
  371. #define IDirectInputDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a)
  372. #define IDirectInputDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a)
  373. #define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
  374. #define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c)
  375. #define IDirectInputDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a)
  376. #define IDirectInputDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  377. #define IDirectInputDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
  378. #endif
  379.  
  380. /****************************************************************************
  381.  *
  382.  *      Mouse
  383.  *
  384.  ****************************************************************************/
  385.  
  386. typedef struct _DIMOUSESTATE {
  387.     LONG    lX;
  388.     LONG    lY;
  389.     LONG    lZ;
  390.     BYTE    rgbButtons[4];
  391. } DIMOUSESTATE, *LPDIMOUSESTATE;
  392.  
  393. #define DIMOFS_X        FIELD_OFFSET(DIMOUSESTATE, lX)
  394. #define DIMOFS_Y        FIELD_OFFSET(DIMOUSESTATE, lY)
  395. #define DIMOFS_Z        FIELD_OFFSET(DIMOUSESTATE, lZ)
  396. #define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0)
  397. #define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1)
  398. #define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2)
  399. #define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3)
  400.  
  401. /****************************************************************************
  402.  *
  403.  *      Keyboard
  404.  *
  405.  ****************************************************************************/
  406.  
  407. /****************************************************************************
  408.  *
  409.  *      DirectInput keyboard scan codes
  410.  *
  411.  ****************************************************************************/
  412.  
  413. #define DIK_ESCAPE          0x01
  414. #define DIK_1               0x02
  415. #define DIK_2               0x03
  416. #define DIK_3               0x04
  417. #define DIK_4               0x05
  418. #define DIK_5               0x06
  419. #define DIK_6               0x07
  420. #define DIK_7               0x08
  421. #define DIK_8               0x09
  422. #define DIK_9               0x0A
  423. #define DIK_0               0x0B
  424. #define DIK_MINUS           0x0C    /* - on main keyboard */
  425. #define DIK_EQUALS          0x0D
  426. #define DIK_BACK            0x0E    /* backspace */
  427. #define DIK_TAB             0x0F
  428. #define DIK_Q               0x10
  429. #define DIK_W               0x11
  430. #define DIK_E               0x12
  431. #define DIK_R               0x13
  432. #define DIK_T               0x14
  433. #define DIK_Y               0x15
  434. #define DIK_U               0x16
  435. #define DIK_I               0x17
  436. #define DIK_O               0x18
  437. #define DIK_P               0x19
  438. #define DIK_LBRACKET        0x1A
  439. #define DIK_RBRACKET        0x1B
  440. #define DIK_RETURN          0x1C    /* Enter on main keyboard */
  441. #define DIK_LCONTROL        0x1D
  442. #define DIK_A               0x1E
  443. #define DIK_S               0x1F
  444. #define DIK_D               0x20
  445. #define DIK_F               0x21
  446. #define DIK_G               0x22
  447. #define DIK_H               0x23
  448. #define DIK_J               0x24
  449. #define DIK_K               0x25
  450. #define DIK_L               0x26
  451. #define DIK_SEMICOLON       0x27
  452. #define DIK_APOSTROPHE      0x28
  453. #define DIK_GRAVE           0x29    /* accent grave */
  454. #define DIK_LSHIFT          0x2A
  455. #define DIK_BACKSLASH       0x2B
  456. #define DIK_Z               0x2C
  457. #define DIK_X               0x2D
  458. #define DIK_C               0x2E
  459. #define DIK_V               0x2F
  460. #define DIK_B               0x30
  461. #define DIK_N               0x31
  462. #define DIK_M               0x32
  463. #define DIK_COMMA           0x33
  464. #define DIK_PERIOD          0x34    /* . on main keyboard */
  465. #define DIK_SLASH           0x35    /* / on main keyboard */
  466. #define DIK_RSHIFT          0x36
  467. #define DIK_MULTIPLY        0x37    /* * on numeric keypad */
  468. #define DIK_LMENU           0x38    /* left Alt */
  469. #define DIK_SPACE           0x39
  470. #define DIK_CAPITAL         0x3A
  471. #define DIK_F1              0x3B
  472. #define DIK_F2              0x3C
  473. #define DIK_F3              0x3D
  474. #define DIK_F4              0x3E
  475. #define DIK_F5              0x3F
  476. #define DIK_F6              0x40
  477. #define DIK_F7              0x41
  478. #define DIK_F8              0x42
  479. #define DIK_F9              0x43
  480. #define DIK_F10             0x44
  481. #define DIK_NUMLOCK         0x45
  482. #define DIK_SCROLL          0x46    /* Scroll Lock */
  483. #define DIK_NUMPAD7         0x47
  484. #define DIK_NUMPAD8         0x48
  485. #define DIK_NUMPAD9         0x49
  486. #define DIK_SUBTRACT        0x4A    /* - on numeric keypad */
  487. #define DIK_NUMPAD4         0x4B
  488. #define DIK_NUMPAD5         0x4C
  489. #define DIK_NUMPAD6         0x4D
  490. #define DIK_ADD             0x4E    /* + on numeric keypad */
  491. #define DIK_NUMPAD1         0x4F
  492. #define DIK_NUMPAD2         0x50
  493. #define DIK_NUMPAD3         0x51
  494. #define DIK_NUMPAD0         0x52
  495. #define DIK_DECIMAL         0x53    /* . on numeric keypad */
  496. #define DIK_F11             0x57
  497. #define DIK_F12             0x58
  498.  
  499. #define DIK_F13             0x64    /*                     (NEC PC98) */
  500. #define DIK_F14             0x65    /*                     (NEC PC98) */
  501. #define DIK_F15             0x66    /*                     (NEC PC98) */
  502.  
  503. #define DIK_KANA            0x70    /* (Japanese keyboard)            */
  504. #define DIK_CONVERT         0x79    /* (Japanese keyboard)            */
  505. #define DIK_NOCONVERT       0x7B    /* (Japanese keyboard)            */
  506. #define DIK_YEN             0x7D    /* (Japanese keyboard)            */
  507. #define DIK_NUMPADEQUALS    0x8D    /* = on numeric keypad (NEC PC98) */
  508. #define DIK_CIRCUMFLEX      0x90    /* (Japanese keyboard)            */
  509. #define DIK_AT              0x91    /*                     (NEC PC98) */
  510. #define DIK_COLON           0x92    /*                     (NEC PC98) */
  511. #define DIK_UNDERLINE       0x93    /*                     (NEC PC98) */
  512. #define DIK_KANJI           0x94    /* (Japanese keyboard)            */
  513. #define DIK_STOP            0x95    /*                     (NEC PC98) */
  514. #define DIK_AX              0x96    /*                     (Japan AX) */
  515. #define DIK_UNLABELED       0x97    /*                        (J3100) */
  516. #define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */
  517. #define DIK_RCONTROL        0x9D
  518. #define DIK_NUMPADCOMMA     0xB3    /* , on numeric keypad (NEC PC98) */
  519. #define DIK_DIVIDE          0xB5    /* / on numeric keypad */
  520. #define DIK_SYSRQ           0xB7
  521. #define DIK_RMENU           0xB8    /* right Alt */
  522. #define DIK_HOME            0xC7    /* Home on arrow keypad */
  523. #define DIK_UP              0xC8    /* UpArrow on arrow keypad */
  524. #define DIK_PRIOR           0xC9    /* PgUp on arrow keypad */
  525. #define DIK_LEFT            0xCB    /* LeftArrow on arrow keypad */
  526. #define DIK_RIGHT           0xCD    /* RightArrow on arrow keypad */
  527. #define DIK_END             0xCF    /* End on arrow keypad */
  528. #define DIK_DOWN            0xD0    /* DownArrow on arrow keypad */
  529. #define DIK_NEXT            0xD1    /* PgDn on arrow keypad */
  530. #define DIK_INSERT          0xD2    /* Insert on arrow keypad */
  531. #define DIK_DELETE          0xD3    /* Delete on arrow keypad */
  532. #define DIK_LWIN            0xDB    /* Left Windows key */
  533. #define DIK_RWIN            0xDC    /* Right Windows key */
  534. #define DIK_APPS            0xDD    /* AppMenu key */
  535.  
  536. /*
  537.  *  Alternate names for keys, to facilitate transition from DOS.
  538.  */
  539. #define DIK_BACKSPACE       DIK_BACK            /* backspace */
  540. #define DIK_NUMPADSTAR      DIK_MULTIPLY        /* * on numeric keypad */
  541. #define DIK_LALT            DIK_LMENU           /* left Alt */
  542. #define DIK_CAPSLOCK        DIK_CAPITAL         /* CapsLock */
  543. #define DIK_NUMPADMINUS     DIK_SUBTRACT        /* - on numeric keypad */
  544. #define DIK_NUMPADPLUS      DIK_ADD             /* + on numeric keypad */
  545. #define DIK_NUMPADPERIOD    DIK_DECIMAL         /* . on numeric keypad */
  546. #define DIK_NUMPADSLASH     DIK_DIVIDE          /* / on numeric keypad */
  547. #define DIK_RALT            DIK_RMENU           /* right Alt */
  548. #define DIK_UPARROW         DIK_UP              /* UpArrow on arrow keypad */
  549. #define DIK_PGUP            DIK_PRIOR           /* PgUp on arrow keypad */
  550. #define DIK_LEFTARROW       DIK_LEFT            /* LeftArrow on arrow keypad */
  551. #define DIK_RIGHTARROW      DIK_RIGHT           /* RightArrow on arrow keypad */
  552. #define DIK_DOWNARROW       DIK_DOWN            /* DownArrow on arrow keypad */
  553. #define DIK_PGDN            DIK_NEXT            /* PgDn on arrow keypad */
  554.  
  555. /****************************************************************************
  556.  *
  557.  *  IDirectInput
  558.  *
  559.  ****************************************************************************/
  560.  
  561. #define DIENUM_STOP             0
  562. #define DIENUM_CONTINUE         1
  563.  
  564. typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID);
  565. typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW, LPVOID);
  566. #ifdef UNICODE
  567. #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKW
  568. #else
  569. #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKA
  570. #endif // !UNICODE
  571.  
  572. #define DIEDFL_ALLDEVICES       0x00000000
  573. #define DIEDFL_ATTACHEDONLY     0x00000001
  574.  
  575. #undef INTERFACE
  576. #define INTERFACE IDirectInputW
  577.  
  578. DECLARE_INTERFACE_(IDirectInputW, IUnknown)
  579. {
  580.     /*** IUnknown methods ***/
  581.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  582.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  583.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  584.  
  585.     /*** IDirectInputW methods ***/
  586.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE;
  587.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE;
  588.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  589.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  590.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  591. };
  592.  
  593. typedef struct IDirectInputW *LPDIRECTINPUTW;
  594.  
  595. #undef INTERFACE
  596. #define INTERFACE IDirectInputA
  597.  
  598. DECLARE_INTERFACE_(IDirectInputA, IUnknown)
  599. {
  600.     /*** IUnknown methods ***/
  601.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  602.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  603.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  604.  
  605.     /*** IDirectInputA methods ***/
  606.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE;
  607.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE;
  608.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  609.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  610.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  611. };
  612.  
  613. typedef struct IDirectInputA *LPDIRECTINPUTA;
  614.  
  615. #ifdef UNICODE
  616. #define IID_IDirectInput IID_IDirectInputW
  617. #define IDirectInput IDirectInputW
  618. #define IDirectInputVtbl IDirectInputWVtbl
  619. #else
  620. #define IID_IDirectInput IID_IDirectInputA
  621. #define IDirectInput IDirectInputA
  622. #define IDirectInputVtbl IDirectInputAVtbl
  623. #endif
  624. typedef struct IDirectInput *LPDIRECTINPUT;
  625.  
  626. #if !defined(__cplusplus) || defined(CINTERFACE)
  627. #define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  628. #define IDirectInput_AddRef(p) (p)->lpVtbl->AddRef(p)
  629. #define IDirectInput_Release(p) (p)->lpVtbl->Release(p)
  630. #define IDirectInput_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c)
  631. #define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)
  632. #define IDirectInput_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a)
  633. #define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  634. #define IDirectInput_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
  635. #endif
  636.  
  637. extern HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter);
  638. extern HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter);
  639. #ifdef UNICODE
  640. #define DirectInputCreate  DirectInputCreateW
  641. #else
  642. #define DirectInputCreate  DirectInputCreateA
  643. #endif // !UNICODE
  644.  
  645. /****************************************************************************
  646.  *
  647.  *  Return Codes
  648.  *
  649.  ****************************************************************************/
  650.  
  651. /*
  652.  *  The operation completed successfully.
  653.  */
  654. #define DI_OK                           S_OK
  655.  
  656. /*
  657.  *  The device exists but is not currently attached.
  658.  */
  659. #define DI_NOTATTACHED                  S_FALSE
  660.  
  661. /*
  662.  *  The device buffer overflowed; some input was lost.
  663.  */
  664. #define DI_BUFFEROVERFLOW               S_FALSE
  665.  
  666. /*
  667.  *  The change in device properties had no effect.
  668.  */
  669. #define DI_PROPNOEFFECT                 S_FALSE
  670.  
  671. /*
  672.  *  The device is a polled device.  As a result, device buffering
  673.  *  will not collect any data and event notifications will not be
  674.  *  signalled until GetDeviceState is called.
  675.  */
  676. #define DI_POLLEDDEVICE                 ((HRESULT)0x00000002L)
  677.  
  678. /*
  679.  *  The application requires a newer version of DirectInput.
  680.  */
  681. #define DIERR_OLDDIRECTINPUTVERSION     \
  682.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION)
  683.  
  684. /*
  685.  *  The application was written for an unsupported prerelease version
  686.  *  of DirectInput.
  687.  */
  688. #define DIERR_BETADIRECTINPUTVERSION    \
  689.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP)
  690.  
  691. /*
  692.  *  The object could not be created due to an incompatible driver version
  693.  *  or mismatched or incomplete driver components.
  694.  */
  695. #define DIERR_BADDRIVERVER              \
  696.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL)
  697.  
  698. /*
  699.  * The device or device instance is not registered with DirectInput.
  700.  */
  701. #define DIERR_DEVICENOTREG              REGDB_E_CLASSNOTREG
  702.  
  703. /*
  704.  * The requested object does not exist.
  705.  */
  706. #define DIERR_OBJECTNOTFOUND            \
  707.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
  708.  
  709. /*
  710.  * An invalid parameter was passed to the returning function,
  711.  * or the object was not in a state that admitted the function
  712.  * to be called.
  713.  */
  714. #define DIERR_INVALIDPARAM              E_INVALIDARG
  715.  
  716. /*
  717.  * The specified interface is not supported by the object
  718.  */
  719. #define DIERR_NOINTERFACE               E_NOINTERFACE
  720.  
  721. /*
  722.  * An undetermined error occured inside the DInput subsystem
  723.  */
  724. #define DIERR_GENERIC                   E_FAIL
  725.  
  726. /*
  727.  * The DInput subsystem couldn't allocate sufficient memory to complete the
  728.  * caller's request.
  729.  */
  730. #define DIERR_OUTOFMEMORY               E_OUTOFMEMORY
  731.  
  732. /*
  733.  * The function called is not supported at this time
  734.  */
  735. #define DIERR_UNSUPPORTED               E_NOTIMPL
  736.  
  737. /*
  738.  * This object has not been initialized
  739.  */
  740. #define DIERR_NOTINITIALIZED            \
  741.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY)
  742.  
  743. /*
  744.  * This object is already initialized
  745.  */
  746. #define DIERR_ALREADYINITIALIZED        \
  747.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED)
  748.  
  749. /*
  750.  * This object does not support aggregation
  751.  */
  752. #define DIERR_NOAGGREGATION             CLASS_E_NOAGGREGATION
  753.  
  754. /*
  755.  * Another app has a higher priority level, preventing this call from
  756.  * succeeding.
  757.  */
  758. #define DIERR_OTHERAPPHASPRIO           E_ACCESSDENIED
  759.  
  760. /*
  761.  * Access to the input device has been lost.  It must be re-acquired.
  762.  */
  763. #define DIERR_INPUTLOST                 \
  764.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT)
  765.  
  766. /*
  767.  * The operation cannot be performed while the device is acquired.
  768.  */
  769. #define DIERR_ACQUIRED                  \
  770.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY)
  771.  
  772. /*
  773.  * The operation cannot be performed unless the device is acquired.
  774.  */
  775. #define DIERR_NOTACQUIRED               \
  776.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS)
  777.  
  778. /*
  779.  * The specified property cannot be changed.
  780.  */
  781. #define DIERR_READONLY                  E_ACCESSDENIED
  782.  
  783. /*
  784.  * The device already has an event notification associated with it.
  785.  */
  786. #define DIERR_HANDLEEXISTS              E_ACCESSDENIED
  787.  
  788. /*
  789.  * Data is not yet available.
  790.  */
  791. #ifndef E_PENDING
  792. #define E_PENDING                       0x80070007L
  793. #endif
  794.  
  795. #ifdef __cplusplus
  796. };
  797. #endif
  798.  
  799. #endif  /* __DINPUT_INCLUDED__ */
  800.  
  801. /****************************************************************************
  802.  *
  803.  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
  804.  *  than the current sdk files
  805.  *
  806.  ****************************************************************************/
  807.  
  808. #ifdef _INC_MMSYSTEM
  809. #ifndef MMNOJOY
  810.  
  811. #ifndef __VJOYDX_INCLUDED__
  812. #define __VJOYDX_INCLUDED__
  813.  
  814. #ifdef __cplusplus
  815. extern "C" {
  816. #endif
  817.  
  818. /*
  819.  * Flag to indicate that the dwReserved2 field of the JOYINFOEX structure
  820.  * contains mini-driver specific data to be passed by VJoyD to the mini-
  821.  * driver instead of doing a poll.
  822.  */
  823. #define JOY_PASSDRIVERDATA          0x10000000l
  824.  
  825. /*
  826.  * Informs the joystick driver that the configuration has been changed
  827.  * and should be reloaded from the registery.
  828.  * dwFlags is reserved and should be set to zero
  829.  */
  830. WINMMAPI MMRESULT WINAPI joyConfigChanged( DWORD dwFlags );
  831.  
  832. /*
  833.  * Hardware Setting indicating that the device is a headtracker
  834.  */
  835. #define JOY_HWS_ISHEADTRACKER       0x02000000l
  836.  
  837. /*
  838.  * Hardware Setting indicating that the VxD is used to replace
  839.  * the standard analog polling
  840.  */
  841. #define JOY_HWS_ISGAMEPORTDRIVER    0x04000000l
  842.  
  843. #ifdef __cplusplus
  844. };
  845. #endif
  846.  
  847. #endif  /* __VJOYDX_INCLUDED__ */
  848.  
  849. #endif  /* not MMNOJOY */
  850. #endif  /* _INC_MMSYSTEM */
  851.  
  852. /****************************************************************************
  853.  *
  854.  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
  855.  *  than the current ddk files
  856.  *
  857.  ****************************************************************************/
  858.  
  859. #ifdef _INC_MMDDK
  860. #ifndef MMNOJOYDEV
  861.  
  862. #ifndef __VJOYDXD_INCLUDED__
  863. #define __VJOYDXD_INCLUDED__
  864. /*
  865.  * Poll type in which the do_other field of the JOYOEMPOLLDATA
  866.  * structure contains mini-driver specific data passed from an app.
  867.  */
  868. #define JOY_OEMPOLL_PASSDRIVERDATA  7
  869.  
  870. #endif  /* __VJOYDXD_INCLUDED__ */
  871.  
  872. #endif  /* not MMNOJOYDEV */
  873. #endif  /* _INC_MMDDK */
  874.